package cn.pupil.springframework.beans.factory;

import cn.pupil.springframework.beans.BeansException;

/**
 * @Description: Bean工厂，代表了Bean对象的工厂
 * @Author: pupil
 * @Date: 2024/10/08 下午 7:55
 */
public interface BeanFactory {

    /**
     * 获取 Bean对象
     *
     * @param name bean名
     * @return
     */
    Object getBean(String name) throws BeansException;

    /**
     * 获取 Bean对象
     *
     * @param name bean名
     * @param args 构造函数的参数
     * @return
     */
    Object getBean(String name, Object... args) throws BeansException;

    /**
     * 获取 Bean对象
     * @param name bean名
     * @param requiredType class类
     * @param <T>
     * @return
     * @throws BeansException
     */
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;

    /**
     * 获取 Bean对象
     * @param requiredType class类
     * @param <T>
     * @return
     * @throws BeansException
     */
    <T> T getBean(Class<T> requiredType) throws BeansException;

    /**
     *此bean工厂是否包含bean定义或外部注册的单例
     *具有给定名称的实例？
     *<p>如果给定的名称是别名，它将被翻译回相应的
     *规范bean名称。
     *<p>如果这个工厂是分层的，如果bean不能，将询问任何父工厂
     *在这个工厂实例中可以找到。
     *<p>如果找到与给定名称匹配的bean定义或单例实例，
     *无论命名的bean定义是否具体，此方法都将返回{@code true}
     *无论是抽象的、懒惰的还是渴望的，无论在范围上与否。因此，请注意，{@code true}
     *此方法的返回值不一定表示{@link#getBean}
     *将能够获得同名的实例。
     *@param name 要查询的bean的名称
     *@return是否存在具有给定名称的bean
     */
    boolean containsBean(String name);
}
